package com.xiaoh.dormitoryrepairreportbackend.utils;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

/**
 * 查询工具类
 */
public class QueryUtils {

    /**
     * 默认页面大小
     */
    public static final int DEFAULT_PAGE_SIZE = 10;

    /**
     * 最大页面大小
     */
    public static final int MAX_PAGE_SIZE = 100;

    /**
     * 添加游标分页条件
     */
    public static <T> void addCursorPagination(QueryWrapper<T> queryWrapper, Long lastId, Integer pageSize) {
        // 游标分页：使用 id > lastId 进行查询
        if (lastId != null && lastId > 0) {
            queryWrapper.gt("id", lastId);
        }

        // 限制页面大小
        int size = pageSize != null ? Math.min(pageSize, MAX_PAGE_SIZE) : DEFAULT_PAGE_SIZE;
        queryWrapper.orderByAsc("id");
        queryWrapper.last("LIMIT " + size);
    }

    /**
     * 添加字符串模糊查询条件
     */
    public static <T> void addLikeCondition(QueryWrapper<T> queryWrapper, String column, String value) {
        if (StrUtil.isNotBlank(value)) {
            queryWrapper.like(column, value);
        }
    }

    /**
     * 添加相等查询条件
     */
    public static <T> void addEqCondition(QueryWrapper<T> queryWrapper, String column, Object value) {
        if (value != null && !value.equals("")) {
            queryWrapper.eq(column, value);
        }
    }

    /**
     * 添加时间范围查询条件
     */
    public static <T> void addTimeRangeCondition(QueryWrapper<T> queryWrapper, String column, 
                                                Object startTime, Object endTime) {
        if (startTime != null) {
            queryWrapper.ge(column, startTime);
        }
        if (endTime != null) {
            queryWrapper.le(column, endTime);
        }
    }

    /**
     * 验证页面大小
     */
    public static int validatePageSize(Integer pageSize) {
        if (pageSize == null || pageSize <= 0) {
            return DEFAULT_PAGE_SIZE;
        }
        return Math.min(pageSize, MAX_PAGE_SIZE);
    }

    /**
     * 创建总数查询的QueryWrapper（不包含分页条件）
     * 用于获取满足条件的总记录数
     *
     * @param originalWrapper 原始查询条件
     * @param <T>            实体类型
     * @return 用于总数查询的QueryWrapper
     */
    public static <T> QueryWrapper<T> createCountQueryWrapper(QueryWrapper<T> originalWrapper) {
        QueryWrapper<T> countWrapper = new QueryWrapper<>();

        // 复制查询条件，但排除ORDER BY和LIMIT
        if (originalWrapper.getSqlSegment() != null) {
            String sqlSegment = originalWrapper.getSqlSegment();
            // 移除ORDER BY和LIMIT部分
            sqlSegment = sqlSegment.replaceAll("(?i)\\s+ORDER\\s+BY\\s+[^\\s]+(?:\\s+(?:ASC|DESC))?", "");
            sqlSegment = sqlSegment.replaceAll("(?i)\\s+LIMIT\\s+\\d+", "");

            if (StrUtil.isNotBlank(sqlSegment.trim())) {
                countWrapper.apply(sqlSegment);
            }
        }

        return countWrapper;
    }

    /**
     * 计算当前页码（基于游标分页的近似计算）
     *
     * @param lastId   游标ID
     * @param pageSize 每页大小
     * @param total    总记录数
     * @return 估算的当前页码
     */
    public static Long calculateCurrentPage(Long lastId, Integer pageSize, Long total) {
        if (lastId == null || lastId <= 0) {
            return 1L;
        }

        int size = validatePageSize(pageSize);
        // 简单估算：假设ID是连续的，根据lastId和pageSize估算页码
        // 这是一个近似值，用于前端显示
        Long estimatedPage = (lastId / size) + 1;

        // 确保页码不超过总页数
        Long totalPages = (total + size - 1) / size;
        return Math.min(estimatedPage, totalPages);
    }

    /**
     * 获取下一页的游标ID
     *
     * @param records 当前页记录
     * @param <T>     实体类型（必须有getId方法）
     * @return 下一页游标ID，如果没有下一页则返回null
     */
    public static <T> Long getNextCursor(java.util.List<T> records) {
        if (records == null || records.isEmpty()) {
            return null;
        }

        try {
            // 获取最后一条记录的ID作为下一页游标
            T lastRecord = records.get(records.size() - 1);
            java.lang.reflect.Method getIdMethod = lastRecord.getClass().getMethod("getId");
            Object id = getIdMethod.invoke(lastRecord);

            if (id instanceof Long) {
                return (Long) id;
            } else if (id instanceof Integer) {
                return ((Integer) id).longValue();
            }
        } catch (Exception e) {
            // 如果获取ID失败，返回null
        }

        return null;
    }
}
